package com.dys.dao.impl;

import com.dys.dao.UserDAO;
import com.dys.entity.User;
import com.dys.util.DatabaseApacheUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.SQLException;
import java.util.List;

/**
 * @className: com.dys.dao.impl.UserDAOImpl
 * @description: com.dys.dao.impl
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/16 下午12:41
 */
public class UserDAOImpl implements UserDAO {
    // 初始化QueryRunner
    private QueryRunner qr = new QueryRunner(DatabaseApacheUtils.getDataSource());

    @Override
    public int insertUser(User user) throws SQLException {
        // 1.准备SQL
        String sql = "insert into user(username,password) values(?,?)";
        // 2.基于QueryRunner执行SQL语句，传入占位符参数，获取结果
        int count = qr.update(sql, user.getUsername(), user.getPassword());
        // 3.返回几行受影响
        return count;
    }

    @Override
    public int updateUserById(User user) throws SQLException {
        // 1.准备SQL
        String sql = "update user set username = ?,password = ? where id = ?";
        // 2.基于QueryRunner执行SQL语句，传入占位符参数，获取结果
        int count = qr.update(sql, user.getUsername(), user.getPassword(), user.getId());
        // 3.返回几行受影响
        return count;
    }

    @Override
    public int deleteUserById(int id) throws SQLException {
        // 1.准备SQL
        String sql = "delete from user where id = ?";
        // 2.基于QueryRunner执行SQL语句，传入占位符参数，获取结果
        int count = qr.update(sql, id);
        // 3.返回几行受影响
        return count;
    }

    @Override
    public List<User> selectAllUser() throws SQLException {
        // 1.准备SQL
        String sql = "select * from user";
        // 2.基于QueryRunner执行SQL语句，传入占位符参数，获取结果
        // BeanListHandler：将多行返回结果，封装为一个集合。当前query方法返回一个List<entity\>实例。
        List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
        // 3.返回结果
        return list;
    }

    @Override
    public User selectUserById(int id) throws SQLException {
        // 1.准备SQL
        String sql = "select * from user where id = ?";
        // 2.基于QueryRunner执行SQL语句，传入占位符参数，
        // BeanHandler 获取结果,将一行返回结果，封装为一个对象。当前query方法返回一个entity实例。
        User user = qr.query(sql, new BeanHandler<User>(User.class), id);
        // 3.返回结果
        return user;
    }

    @Override
    public Long selectCount() throws SQLException {
        // 1.准备SQL
        String sql = "select count(*) from user";
        // ScalarHandler：只返回第一行第一列的一个结果。
        Long result = qr.query(sql, new ScalarHandler<Long>());
        // 3.返回结果
        return result;
    }
}
